In commit
9bd22dc0, I introduced an API to load an arbitrary
.desktop file, not necessarily from the menu path. It turns
out this function was broken because it created ShellApp instances
that were *different* from ones that were cached normally.
As far as I can tell, we didn't initially use it. Then later
Util.spawnDesktop was created which used this function.
Remove this broken function and all callers; if we're loading
.desktop files from *outside* the menu path, we can look at
readding.
This patch also kills off Util.spawnDesktop in favor of callers
talking to ShellAppSystem directly, now that the latter reports
errors.
https://bugzilla.gnome.org/show_bug.cgi?id=644402
}
}
-// spawnDesktop:
-// @id: a desktop file ID
-//
-// Spawns the desktop file identified by @id using startup notification,
-// etc, handling any errors that occur when trying to find or start
-// the program.
-function spawnDesktop(id) {
- try {
- trySpawnDesktop(id);
- } catch (err) {
- _handleSpawnError(id, err);
- }
-}
-
// trySpawn:
// @argv: an argv array
//
trySpawn(argv);
}
-// trySpawnDesktop:
-// @id: a desktop file ID
-//
-// Spawns the desktop file identified by @id using startup notification.
-// On error, throws an exception.
-function trySpawnDesktop(id) {
- let app;
-
- // shell_app_system_load_from_desktop_file() will end up returning
- // a stupid error message if the desktop file doesn't exist, but
- // that's the only case it returns an error for, so we just
- // substitute our own error in instead
- try {
- app = Shell.AppSystem.get_default().load_from_desktop_file(id + '.desktop');
- } catch (err) {
- throw new Error(_("No such application"));
- }
-
- try {
- app.launch();
- } catch(err) {
- // see trySpawn
- err.message = err.message.replace(/.*\((.+)\)/, '$1');
- throw err;
- }
-}
-
function _handleSpawnError(command, err) {
let title = _("Execution of '%s' failed:").format(command);
Main.notifyProblem(title, err.message);
_onPreferencesActivate: function() {
this.menu.close();
- Util.spawnDesktop('gnome-datetime-panel');
+ let app = Shell.AppSystem.get_default().get_app('gnome-datetime-panel.desktop');
+ app.activate(-1);
},
_onOpenCalendarActivate: function() {
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addAction(_("Universal Access Settings"), function() {
- Util.spawnDesktop('gnome-universal-access-panel');
+ let app = Shell.AppSystem.get_default().get_app('gnome-universal-access-panel.desktop');
+ app.activate(-1);
});
},
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addAction(_("Power Settings"),function() {
- Util.spawnDesktop('gnome-power-panel');
+ let app = Shell.AppSystem.get_default().get_app('gnome-power-panel.desktop');
+ app.activate(-1);
});
this._proxy.connect('Changed', Lang.bind(this, this._devicesChanged));
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addAction(_("Sound Settings"), function() {
- Util.spawnDesktop('gnome-sound-panel');
+ let app = Shell.AppSystem.get_default().get_app('gnome-sound-panel.desktop');
+ app.activate(-1);
});
this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
_onMyAccountActivate: function() {
Main.overview.hide();
- Util.spawnDesktop('gnome-user-accounts-panel');
+ let app = Shell.AppSystem.get_default().get_app('gnome-user-accounts-panel.desktop');
+ app.activate(-1);
},
_onPreferencesActivate: function() {
Main.overview.hide();
- Util.spawnDesktop('gnome-control-center');
+ let app = Shell.AppSystem.get_default().get_app('gnome-control-center.desktop');
+ app.activate(-1);
},
_onLockScreenActivate: function() {
return info;
}
-static ShellAppInfo *
-shell_app_info_new_from_keyfile_take_ownership (GKeyFile *keyfile,
- const char *path)
-{
- ShellAppInfo *info;
-
- info = g_slice_alloc0 (sizeof (ShellAppInfo));
- info->type = SHELL_APP_INFO_TYPE_DESKTOP_FILE;
- info->refcount = 1;
- info->keyfile = keyfile;
- info->keyfile_path = g_strdup (path);
- return info;
-}
-
static void shell_app_system_class_init(ShellAppSystemClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *)klass;
g_object_weak_ref (G_OBJECT (app), shell_app_system_on_app_weakref, ref);
}
-ShellAppInfo *
-shell_app_system_load_from_desktop_file (ShellAppSystem *system,
- const char *filename,
- GError **error)
-{
- ShellAppInfo *appinfo;
- GKeyFile *keyfile;
- char *full_path = NULL;
- gboolean success;
-
- keyfile = g_key_file_new ();
-
- if (strchr (filename, '/') != NULL)
- {
- success = g_key_file_load_from_file (keyfile, filename, G_KEY_FILE_NONE, error);
- full_path = g_strdup (filename);
- }
- else
- {
- char *app_path = g_build_filename ("applications", filename, NULL);
- success = g_key_file_load_from_data_dirs (keyfile, app_path, &full_path,
- G_KEY_FILE_NONE, error);
- g_free (app_path);
- }
-
- if (!success)
- {
- g_key_file_free (keyfile);
- g_free (full_path);
- return NULL;
- }
-
- appinfo = shell_app_info_new_from_keyfile_take_ownership (keyfile, full_path);
- g_free (full_path);
-
- return appinfo;
-}
-
/**
* shell_app_system_create_from_window:
*
shell_app = shell_app_system_get_app (shell_app_system_get_default (),
shell_app_info_get_id (info));
- ret = g_desktop_app_info_launch_uris_as_manager (gapp, uris,
- G_APP_LAUNCH_CONTEXT (context),
- G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
- NULL, NULL,
- _gather_pid_callback, shell_app,
- error);
+ /* In the case where we know an app, we handle reaping the child internally,
+ * in the window tracker.
+ */
+ if (shell_app != NULL)
+ ret = g_desktop_app_info_launch_uris_as_manager (gapp, uris,
+ G_APP_LAUNCH_CONTEXT (context),
+ G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
+ NULL, NULL,
+ _gather_pid_callback, shell_app,
+ error);
+ else
+ ret = g_desktop_app_info_launch_uris_as_manager (gapp, uris,
+ G_APP_LAUNCH_CONTEXT (context),
+ G_SPAWN_SEARCH_PATH,
+ NULL, NULL,
+ NULL, NULL,
+ error);
g_object_unref (G_OBJECT (gapp));
ShellApp *shell_app_system_lookup_heuristic_basename (ShellAppSystem *system,
const char *id);
-ShellAppInfo *shell_app_system_load_from_desktop_file (ShellAppSystem *system,
- const char *filename,
- GError **error);
ShellAppInfo *shell_app_system_create_from_window (ShellAppSystem *system,
MetaWindow *window);